<!DOCTYPE HTML>
<html>
<head>
<title>UrlDownloadToFile | AutoHotkey</title>
<meta name="description" content="The UrlDownloadToFile command downloads a file from the Internet." />
<meta name="ahk:equiv-v2" content="commands/Download.htm" />
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<link href="../static/theme.css" rel="stylesheet" type="text/css" />
<script src="../static/content.js" type="text/javascript"></script>
<script type="text/javascript">$(function(){0<=window.navigator.userAgent.toLowerCase().indexOf("ucbrowser")&&CaoNiMaDeUc()})</script>
</head>
<body>

<h1>UrlDownloadToFile</h1>

<p>从互联网下载文件.</p>

<pre class="Syntax"><span class="func">UrlDownloadToFile</span>, URL, Filename</pre>
<h2 id="Parameters">参数</h2>
<dl>

  <dt>URL</dt>
  <dd><p>要下载的文件的 URL(统一资源定位符, 可简单理解为网址). 例如, https://someorg.org 可能会获取到该组织的欢迎页面.</p></dd>

  <dt>Filename</dt>
  <dd><p><strong>下载到文件</strong>: 指定要在本地创建的文件名, 如果未指定绝对路径, 则假定在 <a href="../Variables.htm#WorkingDir">%A_WorkingDir%</a>. 任何现有的文件会被新文件<strong>覆盖</strong>.</p>
    <p><strong>下载到变量</strong>: 请参阅下面的<a href="#WHR">示例</a>.</p></dd>

</dl>

<h2 id="Error_Handling">错误处理</h2>
<p><span class="ver">[v1.1.04+]</span>: 此命令失败时会抛出异常. 想了解更多信息, 请参阅<a href="Catch.htm#RuntimeErrors">运行时错误</a>.</p>
<p>如果遇到问题则 <a href="../misc/ErrorLevel.htm">ErrorLevel</a> 被置为 1, 否则为 0.</p>
<h2 id="Remarks">备注</h2>
<p>甚至在远程文件不存在时, 下载也可能显示成功. 这是因为许多网络服务器会发送错误页面代替缺失的文件. 这个错误页面会代替 <em>Filename</em> 被保存起来.</p>
<p>必须安装 Internet Explorer 3 或更高版本, 此功能才有效. 防火墙或多个网络适配器的存在可能导致此功能失败. 此外, 一些网站可能会拦截这样的下载.</p>
<p><strong>缓存</strong>:</p>
<ul>
  <li><span class="ver">[v1.0.44.07+]</span>: 直接从远程服务器中获取 URL 表示的文件(即决不从 Internet Explorer 的缓存中获取). 要允许使用缓存, 请在 URL 前加上 *0 和空格; 例如: <code>*0 https://someorg.org</code>. 在星号后面的零可以替换为任何有效的 dwFlags 数字; 要了解详情, 请在 <a href="https://www.microsoft.com">www.microsoft.com</a> 中搜索 InternetOpenUrl.</li>
  <li>在 1.0.44.07 之前的版本中, 每当可能时都会从缓存中获取文件. 要避免这种情况, 请在 URL 的末尾指定查询字符串. 例如: <code>https://www.someorg.org/doc.html?fakeParam=42</code>. 注: 如果您频繁的下载同一个文件, 那么查询字符串应该进行改变.</li>
</ul>
<p><strong>代理</strong>: 如果在 Microsoft Internet Explorer(IE 浏览器) 的设置中配置了代理, 那么 UrlDownloadToFile 将使用代理服务器访问网络.</p>
<p><strong>FTP 和 Gopher</strong>: <span class="ver">[v1.0.48.04+]</span> 支持 FTP(文件传输协议) 和 Gopher 的 URL. 例如:</p>
<pre>UrlDownloadToFile, ftp://example.com/home/My File.zip, C:\My Folder\My File.zip  <em>; 匿名登录.</em>
UrlDownloadToFile, ftp://user:pass@example.com:21/home/My File.zip, C:\My Folder\My File.zip  <em>; 以指定的用户登录.</em>
UrlDownloadToFile, ftp://user:pass@example.com/My Directory, C:\Dir Listing.html  <em>; 获取 HTML 格式的目录列表.</em></pre>
<h2 id="Related">相关</h2>
<p><a href="FileRead.htm">FileRead</a>, <a href="FileCopy.htm">FileCopy</a></p>
<h2 id="Examples">示例</h2>
<div class="ex" id="ExBasic">
<p><a class="ex_number" href="#ExBasic"></a> 下载文本文件.</p>
<pre>UrlDownloadToFile, https://www.autohotkey.com/download/1.1/version.txt, C:\AutoHotkey Latest Version.txt</pre>
</div>

<div class="ex" id="ExZip">
<p><a class="ex_number" href="#ExZip"></a> 下载 zip 文件.</p>
<pre>UrlDownloadToFile, https://someorg.org/archive.zip, C:\SomeOrg's Archive.zip</pre>
</div>

<div class="ex" id="WHR">
<p><a class="ex_number" href="#WHR"></a> 下载文本到变量.</p>
<pre>whr := ComObjCreate("WinHttp.WinHttpRequest.5.1")
whr.Open("GET", "https://www.autohotkey.com/download/1.1/version.txt", true)
whr.Send()
<em>; 使用 'true'(上面) 和调用下面的函数, 允许脚本保持响应.</em>
whr.WaitForResponse()
version := whr.ResponseText
MsgBox % version
</pre>
</div>

<div class="ex" id="XHR">
<p><a class="ex_number" href="#XHR"></a> 发出异步 HTTP 请求.</p>
<pre>req := ComObjCreate("Msxml2.XMLHTTP")
<em>; 打开启用异步的请求.</em>
req.open("GET", "https://www.autohotkey.com/download/1.1/version.txt", true)
<em>; 设置回调函数 <span class="ver">[需要 v1.1.17+]</span>.</em>
req.onreadystatechange := Func("Ready")
<em>; 发送请求. Ready() 将在其完成后被调用.</em>
req.send()
<em>/*
; 如果你要一直等待到下载完毕, 就不需要 onreadystatechange 了.
; 设置 async=true 和像这样等待, 可以在下载过程中允许脚本保留响应
; 而 async=false 将使脚本无响应.
while req.readyState != 4
    sleep 100
*/</em>
#Persistent

Ready() {
    global req
    if (req.readyState != 4)  <em>; 没有完成.</em>
        return
    if (req.status == 200) <em>; 完成.</em>
        MsgBox % "Latest AutoHotkey version: " req.responseText
    else
        MsgBox 16,, % "Status " req.status
    ExitApp
}</pre>
</div>

</body>
</html>